package model

import (
	"encoding/json"
	"fmt"
)

type Student struct {
	//如果结构体首字母大写的话，在其它包下可以访问
	Name string
	Age  int
}

// 结构体首字母小写，跨包访问没问题：---》工厂模式
type Person struct {
	Name string
	age  int
}

// 工厂模式
func NewPerson(name string, age int) Person {
	return Person{name, age}
}

// 定义工厂模式的函数，相当于构造器
func NewPersons(name string) *Person {
	return &Person{
		Name: name,
	}
}

// 定义set方法和get方法，对age字段进行封装，因为在方法中可以加一系列的限制操作，确保被封装字段的安全性
func (p *Person) SetAge(age int) {
	if age > 0 && age < 100 {
		(*p).age = age
	} else {
		fmt.Println("传入年龄范围不正确")
	}
}
func (p *Person) GetAge() int {
	return (*p).age
}

// json序列化
func ToJson(s *Student) []byte {
	(*s).Age = 200
	personJson, err := json.Marshal(s)
	if err != nil {
		panic("转换错误")
	}
	fmt.Println("转成json后的数据 ", string(personJson))
	return personJson
}

func JsonString(b []byte, p *Student) {
	json.Unmarshal(b, p)
	fmt.Println("json转成结构体的数据 ", *p)
}
